package com.spring.mybatis.controller;

import javax.annotation.Resource;

import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.spring.mybatis.service.UserService;
/**
 * 1.添加@RequiresPermissions注解在每一个controller上面进行细粒度控制
 * 2.添加denied.jsp，当没有权限时候展示
 * @author hsj
 *
 */
@Controller
@RequiresAuthentication
@RequestMapping("/users")
public class UserController {
	
	private static final Logger logger = LoggerFactory.getLogger(UserController.class);
	
	@Resource
	private UserService userService;
	
//	@RequiresPermissions(value = { "查询1" })   //放开就是演示这个没有的权限
	@RequiresPermissions(value = { "查询" })
	@RequestMapping("/loginSuccess")
	public String loginSuccess(){
		
		logger.info("登录成功");
		
		return "../index";
	}

}
//++++++++++++++++++++++++++++++++++++++++++++++++++---1----++++++++++++++++++++++++++++++++++
//shiro添加注解@RequiresPermissions不起作用
//这是因为没有开启spring拦截器，在spring-mvc.xml中加入以下代码就可以了(一定要写在最先加载的xml中，写在后面加载的xml中也不起作用)
//
// 
//
//<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
//        depends-on="lifecycleBeanPostProcessor" />
//<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
//        <property name="securityManager" ref="securityManager" />
//</bean>
// 
//
//lifecycleBeanPostProcessor和securityManager是在shiro配置文件中定义好的：
//复制代码
//<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>
//
//<!-- Shiro安全管理器 -->
//    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
//        <property name="realm" ref="jdbcRealm"></property>
//        <property name="cacheManager" ref="cacheManager"></property>
//    </bean>
//复制代码

//__________________________________+++++++++2++++++++++++____________________________________________-
//描述：配置文件中配置了访问了未授权之后的跳转地址，但结果没能跳转过去，而是直接在页面上抛出未授权异常
//
//分析原因：配置文件可能需要做额外的处理
//
//最终解决方案：
//
//方案1：
//
//<!-- 定义需要特殊处理的异常，用类名或完全路径名作为key，异常页名作为值 -->
//<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
//    <property name="exceptionMappings">
//        <props>
//            <prop key="org.apache.shiro.authz.UnauthorizedException">/Denied</prop>
//        </props>
//    </property>
//</bean>
//
//方案2： 
//不使用注解，而是用配置文件配置url的权限
//
//<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
//    <!-- Shiro的核心安全接口，这个属性是必须的 -->
//    <property name="securityManager" ref="securityManager"/>
//    <!-- 要求登录时的链接(登录页面地址)，非必须的属性，默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
//    <property name="loginUrl" value="/showLogin"/>
//    <!-- 登录成功后要跳转的连接(本例中此属性用不到，因为登录成功后的处理逻辑在LoginController里硬编码) -->
//    <!-- <property name="successUrl" value="/" ></property> -->
//    <!-- 用户访问未对其授权的资源时，所显示的连接 但是使用注解的话这段不起作用，需要使用异常处理器重定向页面-->
//    <property name="unauthorizedUrl" value="/denied"/>
//    <property name="filterChainDefinitions">
//       <value>
//           /Admin=roles[admin]
//           /Common=roles[user]
//       </value>
//    </property>
//</bean>
//
//原因： 
//shiro的源代码ShiroFilterFactoryBean.Java定义的filter必须满足filter instanceof AuthorizationFilter，只有perms，roles，ssl，rest，port才是属于AuthorizationFilter，而anon，authcBasic，auchc，user是AuthenticationFilter，所以unauthorizedUrl设置后页面不跳转 
//Shiro注解模式下，登录失败与没有权限都是通过抛出异常。并且默认并没有去处理或者捕获这些异常。在SpringMVC下需要配置捕获相应异常来通知用户信息